package com.example.backupgeo.controller;

import com.example.backupgeo.entity.User;
import com.example.backupgeo.service.UserService;
import com.example.backupgeo.util.ResultVO;
import com.example.backupgeo.vo.UserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * RestController和Controller两种注解来标识此类负责接收和处理HTTP请求
 * 如果请求的是页面和数据，使用Controller即可；如果请求的仅仅是数据，RestController即可，RestController会将返回的数据转换为json格式。
 * 路由映射：
 *
 *    1.RequestMapping注解主要负责URL的路由映射，它可以添加在Controller类或具体【表情】的方法上
 *    2.如添加在Controller上，则这个controller的所有路由映射都将加上此映射规则，如添加在方法上，
 *    则只有对此方法有效
 *    3.RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则，常用的属性参数如下：
 *      value：请求url的路径，支持URL模板、正则表达式
 *      method：HTTP请求方法
 *      consumers：穷奇的媒体类型（Content-Type），如application/json
 *      produces: 响应的媒体类型
 *      params，headers：请求的参数及请求头的值
 *
 * 参数传递：
 *
 *    1.RequestParam: 将请求参数绑定到控制器的方法参数上，接收到参数来自HTTP请求体或请求url的QueryString，
 *    当请求的参数名称与Controller业务方法参数名称一致时，RequestParam可以省略
 *    2.PathVaraible: 用来处理动态的URL，URL的值可作为控制器中处理方法的参数
 *    3.RequestBody接收的参数是来自requestBody中，即请求体，
 *    一般用于处理非Content-Type:application/x-www-from-urlencoded编码格式的数据，
 *    如：`application/json`、`application/xml`等类型的数据
 */
@RestController
@RequestMapping("/user")
@Api(value = "提供用户的登录和注册接口",tags = "用户管理")
public class UserController {

    @Autowired
    private UserService userService;

    @ApiOperation("查询用户信息列表接口")
    @GetMapping("/list")
    public ResultVO findAll(){
        return userService.findAll();
    }

    @ApiOperation("查询用户信息接口")
    @RequestMapping(value = "/userId",method = RequestMethod.GET)
    public ResultVO queryUserById(String userId){
        return userService.queryUserInfoByUserId(userId);
    }

    @ApiOperation("添加用户接口")
    @RequestMapping(value = "/addUser",method = RequestMethod.POST)
    public ResultVO addUser(@RequestBody User user){
        return userService.addUser(user);
    }

    @ApiOperation("用户登录接口")
    @ApiImplicitParams({
            @ApiImplicitParam(dataType = "string",name = "username",value = "用户登录账号",required = true),
            @ApiImplicitParam(dataType = "string",name = "password",value = "用户登录密码",required = true,defaultValue = "123456"),

    })
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public ResultVO login(@RequestParam String username,@RequestParam String password){
        return userService.login(username,password);
    }

    @ApiOperation("更新用户信息接口")
    @PutMapping("/update")
    public ResultVO update(@RequestBody User user) {
        return userService.update(user);
    }

    @ApiOperation("注销用户信息接口")
    @DeleteMapping("/delete")
    public ResultVO delete(String userId) {
        return userService.deleteUser(userId);
    }

}
